package com.weir.workdemo.work01.limit;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author weir
 */
@Retention(RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface Limit {

    /**
     * 限流的key
     *
     * @return key
     */
    String key() default "";

    /**
     * 限流的前缀
     *
     * @return prefix
     */
    String prefix() default "";

    /**
     * 限流的描述
     *
     * @return description
     */
    String description() default "系统繁忙,请稍后再试.";

    /**
     * 限流的时间单位
     *
     * @return timeUnit
     */
    TimeUnit timeUnit() default TimeUnit.MICROSECONDS;

    /**
     * 限流的时间
     *
     * @return period
     */
    int period();

    /**
     * 限流的次数
     *
     * @return count
     */
    int count();

    /**
     * 限流的次数
     *
     * @return count
     */
    double qps() default 1.0;

    /**
     * 限流的类型
     *
     * @return limitType
     */
    LimitType limitType() default LimitType.CUSTOMER;

    enum LimitType {
        /**
         * 自定义
         */
        CUSTOMER,
        /**
         * 根据IP限流
         */
        IP
    }

}
